/**
 * 面试题 02.05. 链表求和
 *
 * 【中等】
 *
 * 给定两个用链表表示的整数，每个节点包含一个数位。
 * 这些数位是反向存放的，也就是个位排在链表首部。
 * 编写函数对这两个整数求和，并用链表形式返回结果。
 *
 * 示例：
 * 输入：(7 -> 1 -> 6) + (5 -> 9 -> 2)，即617 + 295
 * 输出：2 -> 1 -> 9，即912
 * 进阶：思考一下，假设这些数位是正向存放的，又该如何解决呢?
 *
 * 示例：
 * 输入：(6 -> 1 -> 7) + (2 -> 9 -> 5)，即617 + 295
 * 输出：9 -> 1 -> 2，即912
 * */
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

import { ListNode } from '../utils/list'

function addTwoNumbers(
	l1: ListNode | null,
	l2: ListNode | null
): ListNode | null {
	if (l1 == null && l2 == null) {
		return null
	}
	if (l1 === null && l2) {
		return l2
	}
	if (l2 == null && l1) {
		return l1
	}
	let p1 = l1!
	let p2 = l2!
	let dummy = new ListNode()
	let p = dummy
	let carry = 0
	while (p1 || p2) {
		let sum = 0
		if (p1) {
			sum += +p1.val
			p1 = p1.next
		}
		if (p2) {
			sum += +p2.val
			p2 = p2.next
		}
		sum += carry
		carry = Math.floor(sum / 10)

		p.next = new ListNode(sum % 10)
		p = p.next
	}

	if (carry) {
		p.next = new ListNode(carry)
		p = p.next
	}

	return dummy.next
}
